import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# 绘制箱线图

#定义各种优化算法的验证集合
df_val = pd.DataFrame(np.random.rand(45, 9), columns=['lstm_fedavg_nrmse_val',
                                                      'lstm_simpleavg_nrmse_val',
                                                      'lstm_medianavg_nrmse_val',
                                                      'lstm_fedprox_nrmse_val',
                                                      'lstm_fedavgm_nrmse_val',
                                                      'lstm_fednova_nrmse_val',
                                                      'lstm_fedadagrad_nrmse_val',
                                                      'lstm_fedyogi_nrmse_val',
                                                      'lstm_fedadam_nrmse_val'])
#定义各种优化算法的测试集合
df_test = pd.DataFrame(np.random.rand(45, 9), columns=['lstm_fedavg_nrmse_test',
                                                      'lstm_simpleavg_nrmse_test',
                                                      'lstm_medianavg_nrmse_test',
                                                      'lstm_fedprox_nrmse_test',
                                                      'lstm_fedavgm_nrmse_test',
                                                      'lstm_fednova_nrmse_test',
                                                      'lstm_fedadagrad_nrmse_test',
                                                      'lstm_fedyogi_nrmse_test',
                                                      'lstm_fedadam_nrmse_test'])

df_val["lstm_fedavg_nrmse_val"] = [0.1472942903396821, 0.18761611098567665, 0.1565982293090703, 0.22022223320544154, 0.19832451504854587, 0.16570563445234426, 0.18159736437775298, 0.15376247958370012, 0.1840144206062669, 0.21132224316128118, 0.15772802356924873, 0.14181762128770026, 0.22896339115044057, 0.21467055720019285, 0.28694946334382376, 0.23793146396923728, 0.162502544280537, 0.18381277698914275, 0.1919003062423455, 0.2272044774926323, 0.20001855729774695, 0.19892154815195667, 0.22569136965418296, 0.1716494697530628, 0.21001903367577232, 0.14672662044376245, 0.17812956666353466, 0.16692400830715412, 0.28134186378354836, 0.10393270491439661, 0.11818931422254286, 0.15532918348202712, 0.32573500512911263, 0.1406314909013884, 0.22119576787380452, 0.11312321263735677, 0.0831281736181008, 0.22497832842593252, 0.15102616276056346, 0.1887348839060469, 0.17904851108782152, 0.1521278851208856, 0.09452142480175633, 0.4639652795437035, 0.21114855813280994]
df_val["lstm_simpleavg_nrmse_val"] = [0.14718868401385882, 0.1879019082285592, 0.15487964587228736, 0.2217988464271182, 0.19282185594736276, 0.1658525799200898, 0.18164200114329576, 0.15394071762397274, 0.1835186664416313, 0.21248662826859102, 0.15770234909136657, 0.14124939193792413, 0.22966204340594545, 0.21442628961909255, 0.285159126139814, 0.2361066582980213, 0.16226351557500837, 0.18386565896484872, 0.19201047216704897, 0.22686885621938688, 0.20043173068012565, 0.19893876209076145, 0.22596685379859077, 0.1716354833010394, 0.21078657201747214, 0.146928735273827, 0.1784264714552321, 0.16643360915953748, 0.27928477219091297, 0.1013437277415483, 0.1178890783913579, 0.15447076235212956, 0.31070690220166725, 0.1404104669629898, 0.22113748701634425, 0.10741151534550435, 0.08220674518490481, 0.22380776464124358, 0.15118567463969368, 0.188219217620591, 0.17831515349061117, 0.14974407192370995, 0.09565380871368791, 0.4456150591527264, 0.21154372311743708]
df_val["lstm_medianavg_nrmse_val"] = [0.14310443086868804, 0.1769519099612587, 0.14268087457700124, 0.1976163075178625, 0.164681186030741, 0.16579473183997123, 0.17566085638533757, 0.1544940090950965, 0.17104636762085065, 0.20083829831492975, 0.16007647533729844, 0.14613093183569342, 0.2039928688169368, 0.19406019706143737, 0.2669752445039936, 0.20385579575865787, 0.157358285882689, 0.19004184808670369, 0.18827840159191944, 0.20544329797804572, 0.2001059534143725, 0.20401186956464534, 0.23555398908645547, 0.16932179835785535, 0.20808985390215523, 0.15023709363049115, 0.16672429517593823, 0.1589351147929096, 0.2519501232978655, 0.07152226953576808, 0.11459829066519937, 0.1528370655714006, 0.20021096500405897, 0.14149866550878698, 0.22068424512365975, 0.0888941902974102, 0.06852750736748676, 0.1803275282034139, 0.14935801024691336, 0.18766842853447485, 0.1763222538536093, 0.12145152728587377, 0.08935667510548735, 0.2958202280485572, 0.2137513453120616]
df_val["lstm_fedprox_nrmse_val"] = [0.14718773300614257, 0.1879014049541321, 0.1549062127121345, 0.2218004426694483, 0.19286971612244408, 0.1658516227874427, 0.18164695290959157, 0.15394161049062913, 0.18353227823551177, 0.21248812726996902, 0.1577014546575049, 0.14124976127599148, 0.22966349592125795, 0.21442664449864918, 0.2851607745489818, 0.2361236815990496, 0.16226395061491095, 0.18386531046994606, 0.1920114167865809, 0.2268685342407029, 0.2004344482905085, 0.1989380486412756, 0.2259664757570041, 0.17163650354405965, 0.21079002659420687, 0.14692828494510007, 0.17842797178321024, 0.1664356619627705, 0.27928762812032665, 0.10137936992145906, 0.11788805579138649, 0.15446982765438652, 0.3107517794791268, 0.14041065290956253, 0.22113665685545805, 0.10746617923348144, 0.0822265181083381, 0.22381115045240116, 0.15118496653090036, 0.18821932641203068, 0.17831402094839394, 0.14975097373936128, 0.09566071817916141, 0.44565232868294974, 0.21154364278677878]
df_val["lstm_fedavgm_nrmse_val"] = [0.14718815682555772, 0.18790207598640205, 0.15490533734750686, 0.22180108263434534, 0.19286822853880317, 0.16585175952101616, 0.18164660744190475, 0.15394152120419655, 0.18353199759016076, 0.21248866262504124, 0.1577014227133446, 0.14124966278593462, 0.2296639688312378, 0.21442761322093545, 0.2851610145064838, 0.23612307024241466, 0.1622640781263855, 0.1838650006961447, 0.19201149192657138, 0.22686974549147348, 0.2004343434316273, 0.19893796825244073, 0.22596632249672122, 0.17163642082187852, 0.21078990321744123, 0.14692814467849338, 0.17842829685260933, 0.16643580442767045, 0.27928845144590564, 0.10137877354363223, 0.11788825532378479, 0.15446977042781035, 0.3107488191504388, 0.1404105098737592, 0.2211368058589235, 0.10746383408773694, 0.08222609023307836, 0.2238107921025491, 0.15118507591377608, 0.1882190786092154, 0.17831399332532316, 0.1497514964445593, 0.09566039230324748, 0.4456527633613531, 0.21154360627283317]
df_val["lstm_fednova_nrmse_val"] = [0.14718834806074793, 0.18790247860461376, 0.15490428333047282, 0.22180133273506764, 0.1928662488904714, 0.16585206228781343, 0.18164676578134273, 0.1539413277500816, 0.18353121343175827, 0.21248868209247299, 0.15770148660165875, 0.14124968740845525, 0.22966424750987705, 0.21442780504661166, 0.28516081628073575, 0.2361223874266395, 0.16226406312504074, 0.18386512654181444, 0.1920115455979752, 0.22686998314118229, 0.2004340113781417, 0.19893796825244073, 0.22596642467025468, 0.17163648975703225, 0.21078954336812902, 0.14692824803284815, 0.17842840520894412, 0.1664357526222664, 0.279288348530341, 0.10137729724900237, 0.1178884714835018, 0.1544700756359716, 0.31074848220067036, 0.14041068866849057, 0.22113679876352266, 0.10746260648486688, 0.08222528968628992, 0.2238113481624188, 0.15118517953958535, 0.18821912091703624, 0.17831426955583832, 0.14975112861516574, 0.0956598063821452, 0.4456516194699076, 0.21154368660350525]
df_val["lstm_fedadagrad_nrmse_val"] = [0.11061671447354904, 0.14060750266443475, 0.2113942948264664, 0.14215822500059405, 0.2594959780949482, 0.09394382688987676, 0.17485861324805396, 0.14253540068231632, 0.19412980158343934, 0.13790636743834256, 0.10183341537247763, 0.1337215229475571, 0.16548901232082358, 0.18155629446021304, 0.24897589572224801, 0.20298484389832033, 0.16559532231610188, 0.1373116664282455, 0.13671452579175566, 0.18768899519561058, 0.17747795784690074, 0.15994472218675362, 0.17380268689320658, 0.13582692220401063, 0.2025710826495696, 0.1515595968864376, 0.12865101464760376, 0.18152411614863273, 0.24635011997341916, 0.20434690370660916, 0.0773309057086491, 0.11117277235192183, 0.26552661176649067, 0.13715066401593073, 0.15750899178779923, 0.2545936292965976, 0.16802375137791592, 0.21626100950273702, 0.07093912847560543, 0.18470335470185045, 0.11214699625626634, 0.17782305762551334, 0.14051203327489215, 0.20407319394800005, 0.19076872669214323]
df_val["lstm_fedyogi_nrmse_val"] = [0.14131187119286936, 0.14938271380764387, 0.15816025224103336, 0.1594904141494468, 0.20501383380212818, 0.15993693033724468, 0.18617861378316125, 0.1591298621761537, 0.1659904153498507, 0.17585294093917897, 0.1744003705392301, 0.1300900075420417, 0.18587117379745877, 0.17152881380197196, 0.2531039302576069, 0.21435632150461761, 0.17432736300777935, 0.16721136683034749, 0.16189723430852132, 0.18002650453311364, 0.19379851487803706, 0.18879375436844717, 0.222311120588599, 0.1478258736623891, 0.20355616295719559, 0.13910853565288994, 0.14631206790117043, 0.14893565450367055, 0.23587628538222563, 0.132909815485188, 0.12051342028658625, 0.12794831130100648, 0.22367715224907778, 0.12588543429019455, 0.20394590868831136, 0.22021255549912425, 0.11231938252594817, 0.12403931406168343, 0.13467713085969074, 0.20064612868537177, 0.1436563355351606, 0.1222350120820958, 0.09938573633161248, 0.18983547617840676, 0.20449307797498714]
df_val["lstm_fedadam_nrmse_val"] = [0.14277135110724098, 0.14984383012580602, 0.15660107439642976, 0.15553303876791472, 0.20281053631338408, 0.163558649286258, 0.19114193077724295, 0.1602524669329045, 0.16581396867090578, 0.1742791949803678, 0.17708090472934873, 0.13083744240796147, 0.18016109587370632, 0.16851594076510218, 0.2572408027850332, 0.21874273910726136, 0.1784195594026876, 0.16991669142374038, 0.16126828768837076, 0.17792903673223717, 0.19449518857358178, 0.19198203133014208, 0.22648106897323395, 0.1473457343523978, 0.2045932101447648, 0.14241788399721023, 0.1446180667069641, 0.14725068953524267, 0.2398448668863507, 0.12980171342355867, 0.12277841571725828, 0.1279479140405793, 0.2175861010813557, 0.12806615735323135, 0.2074521474666845, 0.21687808455018323, 0.11147246205860505, 0.12825608252922238, 0.13803872571824605, 0.20524269631544872, 0.1439090588391464, 0.12116302062042253, 0.09968589111557297, 0.1995094385309006, 0.20585957712030845]

# plt.figure(figsize=(30,10))
# 创建图表、数据

print(df_val)

# f = df_val.boxplot(sym = 'o',  # 异常点形状，参考marker
#                vert = True,  # 是否垂直
#                whis = 1.5,  # IQR，默认1.5，也可以设置区间比如[5,95]，代表强制上下边缘为数据95%和5%位置
#                patch_artist = True,  # 上下四分位框内是否填充，True为填充
#                meanline = False, showmeans=True,  # 是否有均值线及其形状
#                showbox = True,  # 是否显示箱线
#                showcaps = True,  # 是否显示边缘线
#                showfliers = True,  # 是否显示异常值
#                notch = False,  # 中间箱体是否缺口
#                return_type='dict'  # 返回类型为字典
#               )
# plt.title('boxplot')


sns.boxplot(data=df_val)
plt.show()